# coding: utf-8
'''
Created on 25 avr. 2011

@author: shin
'''

from business.Element import Element

class ElementDeplacable(Element):
    '''
    Element qui peut être déplacer :
    - Poids
    '''


    def __init__(self, elementDAO):
        '''
        crée les attributs :
        - pointDeVie
        - constitution
        - taille
        - degats
        '''
        Element.__init__(self, elementDAO)
        self.pointDeVie    = 10 * elementDAO.constitution
        self.constitution  = elementDAO.constitution
        self.taille        = elementDAO.taille
        self.degats        = elementDAO.degats
        self._effetNegatif = {}
        self._observer     = None
        
    def calculRecoitCoup(self, degats, type):
        '''
        retire des points de vie en fonction du coup recu
        et de la resistance propre du personnage
        '''
        if self.pointDeVie == 0:
            return 0
        
        if (type == "Mental"):
            degats = (int)(degats * (1 + self.intelligence / 100))
        else:
            degats = (int)(degats * (1 + self.constitution / 100))
        
        if self.pointDeVie - degats <= 0: 
            degats = self.pointDeVie
        return degats
    
    def recoitCoup(self, degats, type):
        self.pointDeVie -= self.calculRecoitCoup(degats, type)
        if self.pointDeVie == 0:
            self.meurt()
    
    def calculRecoitSoin(self, quantite):
        if self.mort():
            raise Exception("On ne soigne pas les morts")
        
        soin = (int) (quantite)    
        max = (int) (10 * self.constitution)
        if self.pointDeVie + quantite > max:
            soin = (int) (max - self.pointDeVie)
        
        return soin
    
    def recoitSoin(self, quantite):
        if self.mort():
            raise Exception("On ne soigne pas les morts")
        self.pointDeVie += self.calculRecoitSoin(quantite)
            
    def meurt(self):
        self.pointDeVie = 0
        self._observer.meurt()
            
    def ressucite(self):
        if self.pointDeVie != 0:
            raise Exception("On ne ressucite pas les vivants !")
        self.pointDeVie = 1
        self._observer.ressucite()
            
    def ajouteEffetNegatif(self, type, malus, temps):
        if type not in self._effetNegatif.keys():
            self._effetNegatif[type] = (malus, temps)
            
    def mort(self):
        return self.pointDeVie == 0
    
    
    def addObserver(self, observer):
        self._observer = observer

    def regardeDroite(self):
        self._observer.regardeDroite()
        
    def regardeGauche(self):
        self._observer.regardeGauche()        